package com.dhj.yygh.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dhj.yygh.common.exception.YyghException;
import com.dhj.yygh.common.result.MyResult;
import com.dhj.yygh.common.result.Result;
import com.dhj.yygh.common.utils.MD5;
import com.dhj.yygh.model.hosp.HospitalSet;
import com.dhj.yygh.service.HospitalSetService;
import com.dhj.yygh.vo.hosp.HospitalSetQueryVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import sun.security.provider.MD4;

import javax.websocket.server.PathParam;
import java.util.List;
import java.util.Random;

@Api(tags = "医院设置的相关接口")
@RestController // 标识为一个 rest 风格的请求处理器且返回 json 数据，实质是 @Controller 与 @ResponseBody 的结合
@RequestMapping("/admin/hospital/hospitalSet") // 映射请求
//@CrossOrigin // 解决跨域问题，允许跨域访问,在配置了 gateway 网关的情况下，可以不需要该注解
public class HospitalSetController {

    @Autowired
    private HospitalSetService hospitalSetService;

    @ApiOperation("获取所有医院的信息")
    @GetMapping("/findAllHospitalSet")
    public MyResult<List<HospitalSet>> findAllHospitalSet() {

        List<HospitalSet> list = hospitalSetService.list();
        return MyResult.ok(list);
    }

    @ApiOperation("按照 id 逻辑删除医院信息")
    @DeleteMapping("/deleteHospitalSetById/{id}")
    public MyResult deleteHospitalSetById(@PathVariable("id") Integer id) {

        boolean flag = hospitalSetService.removeById(id);

        return flag ? MyResult.custom(200, "删除成功!", true) :
                MyResult.custom(201, "删除失败!", false);
    }

    @ApiOperation("医院设置信息的条件分页查询")
    @PostMapping("/findPage/{currPage}/{pageCount}") // 此处需要使用 post 请求，因为现需要传递 json 数据
    public MyResult<Page<HospitalSet>> findPageHospatilSet(
            @PathVariable("currPage") Long currPage,
            @PathVariable("pageCount") Long pageCount,
            // 前端使用 json 传过来数据，Spring 自动将 json 封装为实体对象,需要为 post 请求
            @RequestBody(required = false) HospitalSetQueryVo hospitalSetQueryVo) {

        // 获取分页对象
        Page<HospitalSet> hospitalSetPage = new Page<>(currPage, pageCount);

        // 构造条件
        QueryWrapper<HospitalSet> wrapper = new QueryWrapper<>();

        // 当视图对象不为空时，注入条件构造器
        if (hospitalSetQueryVo != null) {
            String hosname = hospitalSetQueryVo.getHosname(); // 医院名称
            String hoscode = hospitalSetQueryVo.getHoscode(); // 医院编号

            // 当对应参数不为空时，才构造条件，按照医院名和医院编号构造 hospital_set 表的条件查询,条件构造器的条件之间是 && 的关系
            if (!StringUtils.isEmpty(hoscode)) {
                wrapper.like("hosname", hosname);
            }
            if (!StringUtils.isEmpty(hoscode)) {
                wrapper.like("hoscode", hoscode);
            }
        }
        // 获取条件分页后的对象
        Page<HospitalSet> page = hospitalSetService.page(hospitalSetPage, wrapper);

        return MyResult.ok(page);
    }

    @ApiOperation("保存医院设置信息")
    @PostMapping("/saveHospitalSet")
    public MyResult saveHospitalSet(@RequestBody HospitalSet hospitalSet) {
        // 设置医院设置信息的状态,1 可使用 0 不可使用
        hospitalSet.setStatus(1);

        /*
         设置签名密钥
         密钥规则: MD5加密(当前毫秒数 + 1000 内随机值【字符串类型】)
         */
        Random random = new Random();

        String encrypt = MD5.encrypt(System.currentTimeMillis() + random.nextInt(1000) + "");

        // 设置密钥
        hospitalSet.setSignKey(encrypt);

        boolean saveFlag = hospitalSetService.save(hospitalSet);

        return saveFlag ? MyResult.ok(true) : MyResult.fail(false);
    }

    @ApiOperation("按照 id 获取医院信息")
    @GetMapping("/getHospitalSetById/{id}")
    public MyResult<HospitalSet> getHospitalSetById(@PathVariable("id") Long id) {

        HospitalSet hospitalSet = hospitalSetService.getById(id);

        if (hospitalSet != null) {
            return MyResult.ok(hospitalSet);
        }
        return MyResult.fail(201, "没有查询到记录", null);
    }

    @ApiOperation("按照 id 修改医院设置信息")
    @PutMapping("/updateHospitalSet")
    public MyResult updateHospitalSet(@RequestBody HospitalSet hospitalSet) {

        boolean updateFlag = hospitalSetService.updateById(hospitalSet);

        return updateFlag ? MyResult.ok(true) : MyResult.fail(false);
    }

    @ApiOperation("按照 id 列表批量删除医院设置信息")
    @DeleteMapping("/batchDeleteHospitalSet")
    public MyResult batchRemoveHospital(@RequestBody List<Long> ids) {

        boolean removeFlag = hospitalSetService.removeByIds(ids);

        return removeFlag ? MyResult.custom(200, "删除成功!,共删除 " + ids.size() + " 条记录", true) :
                MyResult.custom(201, "批量删除失败!", true);
    }

    /*
     对指定的医院信息进行锁定或解锁
     实质是修改 status 的值，标识该条医院信息记录能否使用，1: 能使用 | 0:不能使用
     */
    @ApiOperation("医院设置的锁定和解锁")
    @PutMapping("/lockHosptialSet/{id}/{status}")
    public MyResult lockHosptialSet(
            @PathVariable("id") Long id,
            @PathVariable("status") Integer status) {

        HospitalSet hospitalSet = hospitalSetService.getById(id);

        hospitalSet.setStatus(status);

        boolean updateFlag = hospitalSetService.updateById(hospitalSet);

        if (status == 1) {
            return updateFlag ? MyResult.ok(200, "已解锁!", true) :
                    MyResult.fail(201, "解锁失败!", false);
        }
        if (status == 0) {
            return updateFlag ? MyResult.ok(200, "已锁定!", true) :
                    MyResult.fail(201, "锁定失败!", false);
        }
        return updateFlag ? MyResult.ok() :
                MyResult.fail();
    }

    @ApiOperation("发送医院设置的签名密钥")
    @GetMapping("/sendkey/{id}")
    public MyResult sendKey(@PathVariable("id") Long id) {

        // int num = 10 / 0; 模拟全局异常

        // 模拟自定义异常
//        try {
//            int num = 10 / 0;
//        } catch (Exception e) {
//            // 自定义异常需要手动抛出
//            throw new YyghException("自定义异常", 204);
//        }

        HospitalSet hospitalSet = hospitalSetService.getById(id);

        if (hospitalSet == null) {
            return MyResult.fail("没有查询到信息!");
        }

        String signKey = hospitalSet.getSignKey();
        String hoscode = hospitalSet.getHoscode();

        // TODO 发送短信
        return MyResult.ok();
    }
}
